package com.tedu;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by IntelliJ IDEA.
 *
 * @author zq
 * @version 1.0
 * @create 2024-08-01 19:57
 * @since jdk1.8
 */
public class ConstructorTest {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class<Point> pointClass = Point.class;
        //获取类名
        System.out.println(pointClass.getName());
        //获取构造方法
        Constructor<Point> constructor = pointClass.getDeclaredConstructor(int.class, int.class);
        //创建行对象
        Point point = constructor.newInstance(23, 10);
        //设置放法私有化可访问
        constructor.setAccessible(true);
        //获取类中的X属性并修改为40
        Field x = pointClass.getDeclaredField("x");
        //设置私有属性可访问
        x.setAccessible(true);
        x.set(point, 40);
        //获取Point中的实例方法(如果是无参函数则null填充)
        Method area1 = pointClass.getMethod("area", null);
        //实例方法必须在一个对象上执行
        Object invoke = area1.invoke(point, null);
        //获取类中带有方法签名的add方法,getMethod第一个参数为方法名,第二个参数为add的参数类型数组
        Method add = pointClass.getMethod("add", int.class, int.class);
        //invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数
        Object invoke1 = add.invoke(null, 13, 13);
        System.out.println("invoke1 = " + invoke1);
        System.out.println("invoke = " + invoke);
        //获取方法名为print的方法
        Method print = pointClass.getMethod("print", null);
        print.invoke(point, null);
    }
}
